import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

// 使用jackson时，封装一个类，用于对应post请求的body的 json类型的键值对数据，即使用jackson把json格式的键值对封装成Java对象。
class User {
    public String username;
    public String password;
}

@WebServlet("/getParameter2")
public class GetParameterServlet2 extends HttpServlet {
    //获取post请求，且body的类型为json的数据
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        // 1.获取postman构造的post请求报文的header中描述 body长度的字段Content-Length,根据字段创建缓冲数组
//        int length = req.getContentLength();
//        byte[] buffer = new byte[length];
//
//        // 2.获取InputStream对象，并且将body的内容读入buffer中。
//        InputStream inputStream = req.getInputStream();
//        inputStream.read(buffer);
//
//        // 3.把字符数组转换成字符串,在服务器控制台打印字符串且也在浏览器上(postman)打印
//        String body = new String(buffer,0,length,"utf-8");
//        System.out.println("body = " + body);
//        resp.getWriter().write(body);

        // 使用jackson涉及到的核心对象：ObjectMapper
        ObjectMapper objectMapper = new ObjectMapper();
        // 把传入的数据 body的json类型键值对数据封装成一个类，.readValue()方法就是读取post请求中的数据
        // 然后根据第二个参数的属性依次填入对象，得到一个Java对象。得到Java对象后，属性值就随便取了。
        User user = objectMapper.readValue(req.getInputStream(), User.class);//需要强制类型转换一下，因为返回的是一个object对象。

        // 把获取到的内容改变格式 到浏览器输出
        resp.getWriter().write("username=" + user.username + " password=" + user.password);

    }
}
